&НаКлиенте
Перем ТекущаяСтрокаМетаданных;

////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ
//

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ВыполнитьПроверкуПравДоступа("Администрирование", Метаданные);

	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

	ПараметрТаблицаРегистрации = Неопределено;
	ПараметрОбъектРегистрации  = Неопределено;
	
//	ОткрытиеСУзломПараметром = Ложь;
	ТекущийОбъект = ЭтотОбъектОбработки();
	
	// Определяем что создают
	Если Параметры.ИдентификаторКоманды = Неопределено Тогда
		// Запуск автономно, возможно с параметром-узлом
		УзелОбменаСсылка = Параметры.УзелОбмена;
		Параметры.Свойство("ЗапрещеноВыбиратьУзелОбмена", ЗапрещеноВыбиратьУзелОбмена);
//		ОткрытиеСУзломПараметром = Истина;

	ИначеЕсли Параметры.ИдентификаторКоманды = "ОткрытьФормуРедактированияРегистрации" Тогда
		Если ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") И Параметры.ОбъектыНазначения.Количество() > 0 Тогда
			// Нас открывают с указанием объекта
			ОбъектНазначения = Параметры.ОбъектыНазначения[0];
			Тип = ТипЗнч(ОбъектНазначения);
			Если ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
				УзелОбменаСсылка = ОбъектНазначения;
//				ОткрытиеСУзломПараметром = Истина;
			Иначе
				// Преобразуем в два наших параметра, при открытии будет создана вторая форма
				Описание = ТекущийОбъект.ХарактеристикиПоМетаданным(ОбъектНазначения.Метаданные());
				Если Описание.ЭтоСсылка Тогда
					ПараметрОбъектРегистрации = ОбъектНазначения;
				ИначеЕсли Описание.ЭтоНабор Тогда
					// Структура и имя таблицы
					ПараметрТаблицаРегистрации = Описание.ИмяТаблицы;
					ПараметрОбъектРегистрации  = Новый Структура;
					Для Каждого Измерение Из ТекущийОбъект.ИзмеренияНабораЗаписей(ПараметрТаблицаРегистрации) Цикл
						ТекИмя = Измерение.Имя;
						ПараметрОбъектРегистрации.Вставить(ТекИмя, ОбъектНазначения.Отбор[ТекИмя].Значение);
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;

		Иначе
			ВызватьИсключение СтрЗаменить(
				НСтр("ru='Неверные параметры команды открытия ""%1""'"), "%1", Параметры.ИдентификаторКоманды);

		КонецЕсли;

	Иначе
		ВызватьИсключение СтрЗаменить(
			НСтр("ru='Нераспознанная команда ""%1""'"), "%1", Параметры.ИдентификаторКоманды);
	КонецЕсли;
	
	// Настройки объекта инициализируем всегда
	ТекущийОбъект.ПрочитатьНастройки();
	ТекущийОбъект.ПрочитатьПризнакПоддержкиБСП();
	ЭтотОбъектОбработки(ТекущийОбъект);
	
	// Остальное инициализируем, только если будем открывать эту форму,
	Если ПараметрОбъектРегистрации <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Список запретных объектов метаданных из параметров
	Параметры.Свойство("ИменаСкрываемыхМетаданных", ИменаСкрываемыхМетаданных);
	
	//@skip-warning
	ТекущаяСтрокаМетаданных = Неопределено;
	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаПустая;
	Параметры.Свойство("ЗапрещеноВыбиратьУзелОбмена", ЗапрещеноВыбиратьУзелОбмена);

	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка,
		Элементы.КоманднаяПанельОбщая);

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	Если ПараметрОбъектРегистрации <> Неопределено Тогда
		// Открываем другую форму
		Отказ = Истина;
		ОткрытьФорму(
			ПолучитьИмяФормы() + "Форма.УзлыРегистрацииОбъекта",
			Новый Структура("ОбъектРегистрации, ТаблицаРегистрации", ПараметрОбъектРегистрации,
			ПараметрТаблицаРегистрации));
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
	// Автосохранение настроек
	СохраняемыеВНастройкахДанныеМодифицированы = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	// Результат выбора запроса, ожидаем структуру
	Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Или (Не ВыбранноеЗначение.Свойство("ДействиеВыбора"))
		Или (Не ВыбранноеЗначение.Свойство("ДанныеВыбора")) Или ТипЗнч(ВыбранноеЗначение.ДействиеВыбора) <> Тип("Булево")
		Или ТипЗнч(ВыбранноеЗначение.ДанныеВыбора) <> Тип("Строка") Тогда
		Ошибка = НСтр("ru='Неожиданный результат выбора из консоли запросов'");
	Иначе
		Ошибка = КонтрольСсылокДляВыбораЗапросом(ВыбранноеЗначение.ДанныеВыбора);
	КонецЕсли;

	Если Ошибка <> "" Тогда
		ПоказатьПредупреждение( , Ошибка);
		Возврат;
	КонецЕсли;

	Если ВыбранноеЗначение.ДействиеВыбора Тогда
		Текст = НСтр("ru='Зарегистрировать результат запроса
					 |на узле ""%1""?'");
	Иначе
		Текст = НСтр("ru='Отменить регистрацию результата запроса
					 |на узле ""%1""?'");
	КонецЕсли;
	Текст = СтрЗаменить(Текст, "%1", Строка(УзелОбменаСсылка));

	ЗаголовокВопроса = НСтр("ru='Подтверждение'");

	Оповещение = Новый ОписаниеОповещения("ОбработкаВыбораЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("ВыбранноеЗначение", ВыбранноеЗначение);
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);

КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

	Если ИмяСобытия = "ИзменениеРегистрацииОбменаДаннымиОбъекта" Тогда
		ЗаполнитьКоличествоРегистрацийВДереве();
		ОбновитьСодержимоеСтраницы();
	ИначеЕсли ИмяСобытия = "ИзменениеДанныхУзлаОбмена" И УзелОбменаСсылка = Параметр Тогда
		УстановитьЗаголовокНомеровСообщений();
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	// Автоматические настройки
	ТекущийОбъект = ЭтотОбъектОбработки();
	ТекущийОбъект.СохранитьНастройки();
	ЭтотОбъектОбработки(ТекущийОбъект);
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

	Если ПараметрОбъектРегистрации <> Неопределено Тогда
		// Будет работа с другой формой
		Возврат;
	КонецЕсли;

	Если ЗначениеЗаполнено(Параметры.УзелОбмена) Тогда
		УзелОбменаСсылка = Параметры.УзелОбмена;
	Иначе
		УзелОбменаСсылка = Настройки["УзелОбменаСсылка"];
		// Если восстановленный узел обмена был удален, то очищаем его
		//@skip-warning
		Если УзелОбменаСсылка <> Неопределено И ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(УзелОбменаСсылка))
			И ПустаяСтрока(УзелОбменаСсылка.ВерсияДанных) Тогда
			УзелОбменаСсылка = Неопределено;
		КонецЕсли;
	КонецЕсли;

	ПроконтролироватьНастройки();
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ
//

&НаКлиенте
Процедура УзелОбменаСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборУзлаПланаОбмена";
	ТекПараметры = Новый Структура("МножественныйВыбор, НачальноеЗначениеВыбора", Ложь, УзелОбменаСсылка);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура УзелОбменаСсылкаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	Если УзелОбменаСсылка <> ВыбранноеЗначение Тогда
		УзелОбменаСсылка = ВыбранноеЗначение;
		ОбработкаВыбораУзлаОбмена();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УзелОбменаСсылкаПриИзменении(Элемент)
	ОбработкаВыбораУзлаОбмена();
	РазвернутьДеревоМетаданных();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура УзелОбменаСсылкаОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ВариантОтбораПоНомеруСообщенияПриИзменении(Элемент)
	УстановитьОтборПоНомеруСообщения(СписокКонстант, ВариантОтбораПоНомеруСообщения);
	УстановитьОтборПоНомеруСообщения(СписокСсылок, ВариантОтбораПоНомеруСообщения);
	УстановитьОтборПоНомеруСообщения(СписокНаборовЗаписей, ВариантОтбораПоНомеруСообщения);
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура ВариантыСпискаОбъектовПриСменеСтраницы(Элемент, ТекущаяСтраница)
	ОбновитьСодержимоеСтраницы(ТекущаяСтраница);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ДеревоМетаданных
//

&НаКлиенте
Процедура ДеревоМетаданныхПометкаПриИзменении(Элемент)
	ИзменениеПометки(Элементы.ДеревоМетаданных.ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура ДеревоМетаданныхПриАктивизацииСтроки(Элемент)
	Если Элементы.ДеревоМетаданных.ТекущаяСтрока <> ТекущаяСтрокаМетаданных Тогда
		ТекущаяСтрокаМетаданных  = Элементы.ДеревоМетаданных.ТекущаяСтрока;
		ПодключитьОбработчикОжидания("НастроитьРедактированиеИзменений", 0.0000001, Истина);
	КонецЕсли;
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СписокКонстант
//

&НаКлиенте
Процедура СписокКонстантОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	Результат = ДобавитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, ВыбранноеЗначение);
	Элементы.СписокКонстант.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
	СообщитьОРезультатахРегистрации(Истина, Результат);

	Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") И ВыбранноеЗначение.Количество() > 0 Тогда
		Элемент.ТекущаяСтрока = ВыбранноеЗначение[0];
	Иначе
		Элемент.ТекущаяСтрока = ВыбранноеЗначение;
	КонецЕсли;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СписокСсылок
//

&НаКлиенте
Процедура СписокСсылокОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	ОбработкаВыбораДанных(Элемент, ВыбранноеЗначение);
КонецПроцедуры
&НаКлиенте
Процедура РедактироватьСсылку(Команда)
	ТекДанные=Элементы.СписокСсылок.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(ТекДанные.Ссылка);
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СписокНаборовЗаписей
//

&НаКлиенте
Процедура СписокНаборовЗаписейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	ПараметрыЗаписи = СтруктураКлючаНабораЗаписей(Элемент.ТекущиеДанные);
	Если ПараметрыЗаписи <> Неопределено Тогда
		ОткрытьФорму(ПараметрыЗаписи.ИмяФормы, Новый Структура("Ключ", ПараметрыЗаписи.Ключ));
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура СписокНаборовЗаписейОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	ОбработкаВыбораДанных(Элемент, ВыбранноеЗначение);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ КОМАНД ФОРМЫ
//

&НаКлиенте
Процедура ДобавитьРегистрациюОдногоОбъекта(Команда)

	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;

	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаКонстанты Тогда
		ДобавитьРегистрациюКонстантыВСписке();
	ИначеЕсли ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		ДобавитьРегистрациюВСписокСсылок();
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		ДобавитьРегистрациюВНаборЗаписейОтбор();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюОдногоОбъекта(Команда)

	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;

	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаКонстанты Тогда
		УдалитьРегистрациюКонстантыВСписке();
	ИначеЕсли ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		УдалитьРегистрациюИзСпискаСсылок();
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		УдалитьРегистрациюВНабореЗаписей();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюОтбор(Команда)

	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;

	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		ДобавитьРегистрациюВСписокОтбор();
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		ДобавитьРегистрациюВНаборЗаписейОтбор();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюОтбор(Команда)

	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;

	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		УдалитьРегистрациюВСпискеОтбор();
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		УдалитьРегистрациюВНабореЗаписейОтбор();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуРегистрацииНаУзлах(Команда)

	Если ЗапрещеноВыбиратьУзелОбмена Тогда
		Возврат;
	КонецЕсли;

	Данные = ПолучитьТекущийОбъектРедактирования();
	Если Данные <> Неопределено Тогда
		ТаблицаРегистрации = ?(ТипЗнч(Данные) = Тип("Структура"), СписокНаборовЗаписейИмяТаблицы, "");
		ОткрытьФорму(ПолучитьИмяФормы() + "Форма.УзлыРегистрацииОбъекта",
			Новый Структура("ОбъектРегистрации, ТаблицаРегистрации, ОповещатьОбИзменениях", Данные, ТаблицаРегистрации,
			Истина), ЭтотОбъект);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПоказатьРезультатВыгрузки(Команда)

	ТекСтраница = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Сериализация = Новый Массив;

	Если ТекСтраница = Элементы.СтраницаКонстанты Тогда
		ЭлементФормы = Элементы.СписокКонстант;
		Для Каждого Строка Из ЭлементФормы.ВыделенныеСтроки Цикл
			ТекДанные = ЭлементФормы.ДанныеСтроки(Строка);
			Сериализация.Добавить(Новый Структура("ФлагТипа, Данные", 1, ТекДанные.МетаПолноеИмя));
		КонецЦикла;

	ИначеЕсли ТекСтраница = Элементы.СтраницаНаборЗаписей Тогда
		СписокИзмерений = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
		ЭлементФормы = Элементы.СписокНаборовЗаписей;
		Префикс = "СписокНаборовЗаписей";
		Для Каждого Элемент Из ЭлементФормы.ВыделенныеСтроки Цикл
			ТекДанные = Новый Структура;
			Данные = ЭлементФормы.ДанныеСтроки(Элемент);
			Для Каждого Имя Из СписокИзмерений Цикл
				ТекДанные.Вставить(Имя, Данные[Префикс + Имя]);
			КонецЦикла;
			Сериализация.Добавить(Новый Структура("ФлагТипа, Данные", 2, ТекДанные));
		КонецЦикла;

	ИначеЕсли ТекСтраница = Элементы.СтраницаСписокСсылок Тогда
		ЭлементФормы = Элементы.СписокСсылок;
		Для Каждого Элемент Из ЭлементФормы.ВыделенныеСтроки Цикл
			ТекДанные = ЭлементФормы.ДанныеСтроки(Элемент);
			Сериализация.Добавить(Новый Структура("ФлагТипа, Данные", 3, ТекДанные.Ссылка));
		КонецЦикла;

	Иначе
		Возврат;
	КонецЕсли;

	Если Сериализация.Количество() > 0 Тогда
		Текст = ТекстСериализации(Сериализация);
		ЗаголовокТекста = НСтр("ru='Результат стандартной выгрузки (РИБ)'");
		Текст.Показать(ЗаголовокТекста);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомераСообщений(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ТекИмяФормы = ПолучитьИмяФормы() + "Форма.НомераСообщенийУзлаПланаОбмена";
		ТекПараметры = Новый Структура("УзелОбменаСсылка", УзелОбменаСсылка);
		ОткрытьФорму(ТекИмяФормы, ТекПараметры);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюКонстанты(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюКонстантыВСписке();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюКонстанты(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюКонстантыВСписке();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюСсылки(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВСписокСсылок();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюУдаленияОбъекта(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюУдаленияОбъектаВСписокСсылок();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюСсылки(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюИзСпискаСсылок();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюСсылкиПодбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВСписокСсылок(Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюСсылкиОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВСписокОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюСсылкиОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВСпискеОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюАвтоОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВыделенныхОбъектов(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюАвтоОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВыделенныхОбъектов(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВсехОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВыделенныхОбъектов();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВсехОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВыделенныхОбъектов();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюНабораЗаписейОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВНаборЗаписейОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюНабораЗаписей(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВНабореЗаписей();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюНабораЗаписейОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВНабореЗаписейОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьВсеДанные(Команда)
	ОбновитьВсеДанныеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбновитьВсеДанныеНаСервере()
	ЗаполнитьКоличествоРегистрацийВДереве();
	ОбновитьСодержимоеСтраницы();
	УстановитьЗаголовокНомеровСообщений();	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюРезультатаЗапроса(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ОперацияСРезультатамиЗапроса(Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюРезультатаЗапроса(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ОперацияСРезультатамиЗапроса(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастроек(Команда)
	ОткрытьФормуНастроекОбработки();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияОбъекта(Команда)

	Если Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаКонстанты Тогда
		РедактироватьНомерСообщенияКонстанты();

	ИначеЕсли Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаСписокСсылок Тогда
		РедактироватьНомерСообщенияСсылки();

	ИначеЕсли Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаНаборЗаписей Тогда
		РедактироватьНомерСообщенияСписокНаборов();
		
	КонецЕсли
	;

КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
//

&НаКлиенте
Процедура ОбработкаВыбораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли
	;
	ВыбранноеЗначение = ДополнительныеПараметры.ВыбранноеЗначение;

	СообщитьОРезультатахРегистрации(ВыбранноеЗначение.ДействиеВыбора, ИзменитьРегистрациюРезультатаЗапросаСервер(
		ВыбранноеЗначение.ДействиеВыбора, ВыбранноеЗначение.ДанныеВыбора));

	ЗаполнитьКоличествоРегистрацийВДереве();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияКонстанты()
	ТекДанные = Элементы.СписокКонстант.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Оповещение = Новый ОписаниеОповещения("РедактироватьНомерСообщенияКонстантыЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("МетаПолноеИмя", ТекДанные.МетаПолноеИмя);

	НомерСообщения = ТекДанные.НомерСообщения;
	Подсказка = НСтр("ru='Номер отправленного'");

	ПоказатьВводЧисла(Оповещение, НомерСообщения, Подсказка);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияКонстантыЗавершение(Знач НомерСообщения, Знач ДополнительныеПараметры) Экспорт
	Если НомерСообщения = Неопределено Тогда
		// Отказ от ввода
		Возврат;
	КонецЕсли;

	СообщитьОРезультатахРегистрации(НомерСообщения, ИзменитьНомерСообщенияНаСервере(УзелОбменаСсылка, НомерСообщения,
		ДополнительныеПараметры.МетаПолноеИмя));

	Элементы.СписокКонстант.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияСсылки()
	ТекДанные = Элементы.СписокСсылок.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Оповещение = Новый ОписаниеОповещения("РедактироватьНомерСообщенияСсылкиЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("Ссылка", ТекДанные.Ссылка);

	НомерСообщения = ТекДанные.НомерСообщения;
	Подсказка = НСтр("ru='Номер отправленного'");

	ПоказатьВводЧисла(Оповещение, НомерСообщения, Подсказка);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияСсылкиЗавершение(Знач НомерСообщения, Знач ДополнительныеПараметры) Экспорт
	Если НомерСообщения = Неопределено Тогда
		// Отказ от ввода
		Возврат;
	КонецЕсли;

	СообщитьОРезультатахРегистрации(НомерСообщения, ИзменитьНомерСообщенияНаСервере(УзелОбменаСсылка, НомерСообщения,
		ДополнительныеПараметры.Ссылка));

	Элементы.СписокСсылок.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияСписокНаборов()
	ТекДанные = Элементы.СписокНаборовЗаписей.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Оповещение = Новый ОписаниеОповещения("РедактироватьНомерСообщенияСписокНаборовЗавершение", ЭтотОбъект,
		Новый Структура);

	ДанныеСтроки = Новый Структура;
	ИменаКлючей = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
	Для Каждого Имя Из ИменаКлючей Цикл
		ДанныеСтроки.Вставить(Имя, ТекДанные["СписокНаборовЗаписей" + Имя]);
	КонецЦикла;

	Оповещение.ДополнительныеПараметры.Вставить("ДанныеСтроки", ДанныеСтроки);

	НомерСообщения = ТекДанные.НомерСообщения;
	Подсказка = НСтр("ru='Номер отправленного'");

	ПоказатьВводЧисла(Оповещение, НомерСообщения, Подсказка);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияСписокНаборовЗавершение(Знач НомерСообщения, Знач ДополнительныеПараметры) Экспорт
	Если НомерСообщения = Неопределено Тогда
		// Отказ от ввода
		Возврат;
	КонецЕсли;

	СообщитьОРезультатахРегистрации(НомерСообщения, ИзменитьНомерСообщенияНаСервере(
		УзелОбменаСсылка, НомерСообщения, ДополнительныеПараметры.ДанныеСтроки, СписокНаборовЗаписейИмяТаблицы));

	Элементы.СписокНаборовЗаписей.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура НастроитьРедактированиеИзменений()
	НастроитьРедактированиеИзмененийСервер(ТекущаяСтрокаМетаданных);
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьДеревоМетаданных()
	Для Каждого Строка Из ДеревоМетаданных.ПолучитьЭлементы() Цикл
		Элементы.ДеревоМетаданных.Развернуть( Строка.ПолучитьИдентификатор());
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура УстановитьЗаголовокНомеровСообщений()

	Текст = НСтр("ru='№ сообщений: отпр. %1, прин. %2'");

	Данные = ПрочитатьНомераСообщений();
	Текст = СтрЗаменить(Текст, "%1", Формат(Данные.НомерОтправленного, "ЧДЦ=0; ЧН="));
	Текст = СтрЗаменить(Текст, "%2", Формат(Данные.НомерПринятого, "ЧДЦ=0; ЧН="));

	Элементы.ФормаРедактироватьНомераСообщений.Заголовок = Текст;
КонецПроцедуры

&НаСервере
Процедура ОбработкаВыбораУзлаОбмена()
	
	// Изменяем номера узлов в гиперссылке по редактированию
	УстановитьЗаголовокНомеровСообщений();
	
	// Обновляем дерево метаданных
	ПрочитатьДеревоМетаданных();
	ЗаполнитьКоличествоРегистрацийВДереве();
	
	// Обновляем активную страницу
	//@skip-warning
	ПоследняяАктивнаяКолонкаМетаданных = Неопределено;
	//@skip-warning
	ПоследняяАктивнаяСтрокаМетаданных  = Неопределено;
	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаПустая;

КонецПроцедуры

&НаКлиенте
Процедура СообщитьОРезультатахРегистрации(Команда, Результаты)

	Если ТипЗнч(Команда) = Тип("Булево") Тогда
		Если Команда Тогда
			ЗаголовокПредупреждения = НСтр("ru='Регистрация изменений:'");
			ТекстПредупреждения = НСтр("ru='Зарегистрировано %1 изменений из %2
									   |на узле ""%0""'");
		Иначе
			ЗаголовокПредупреждения = НСтр("ru='Отмена регистрации:'");
			ТекстПредупреждения = НСтр("ru='Отменена регистрация %1 изменений 
									   |на узле ""%0"".'");
		КонецЕсли;
	Иначе
		ЗаголовокПредупреждения = НСтр("ru='Изменение номера сообщения:'");
		ТекстПредупреждения = НСтр("ru='Номер сообщения изменен на %3
								   |у %1 объекта(ов)'");
	КонецЕсли;

	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%0", УзелОбменаСсылка);
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", Формат(Результаты.Успешно, "ЧН="));
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%2", Формат(Результаты.Всего, "ЧН="));
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%3", Команда);

	Предупреждением = Результаты.Всего <> Результаты.Успешно;
	Если Предупреждением Тогда
		ОбновитьОтображениеДанных();
		ПоказатьПредупреждение( , ТекстПредупреждения, , ЗаголовокПредупреждения);
	Иначе
		ПоказатьОповещениеПользователя(ЗаголовокПредупреждения, ПолучитьНавигационнуюСсылку(УзелОбменаСсылка),
			ТекстПредупреждения, Элементы.СкрытаяКартинкаИнформация32.Картинка);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьФормуВыбораРезультатаЗапроса()

	ТекущийОбъект = ЭтотОбъектОбработки();
	ТекущийОбъект.ПрочитатьНастройки();
	ЭтотОбъектОбработки(ТекущийОбъект);

	Проверка = ТекущийОбъект.ПроверитьКорректностьНастроек();
	ЭтотОбъектОбработки(ТекущийОбъект);
	Если Проверка.НастройкаАдресВнешнейОбработкиЗапросов <> Неопределено Тогда
		Возврат Неопределено;
	ИначеЕсли ПустаяСтрока(ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов) Тогда
		Возврат Неопределено;
	ИначеЕсли НРег(Прав(СокрЛП(ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов), 4)) = ".epf" Тогда
		Обработка = ВнешниеОбработки.Создать(ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов);
		ИдентификаторФормы = ".ФормаОбъекта";
	Иначе
		Обработка = Обработки[ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов].Создать();
		ИдентификаторФормы = ".Форма";
	КонецЕсли;

	Возврат Обработка.Метаданные().ПолноеИмя() + ИдентификаторФормы;
КонецФункции

&НаКлиенте
Процедура ДобавитьРегистрациюКонстантыВСписке()
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборКонстанты";
	ТекПараметры = Новый Структура("УзелОбмена, МассивИменМетаданных, МассивПредставлений, МассивАвторегистрации",
		УзелОбменаСсылка, СтруктураИменМетаданных.Константы, СтруктураПредставленийМетаданных.Константы,
		СтруктураАвторегистрацииМетаданных.Константы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокКонстант);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюКонстантыВСписке()

	Элемент = Элементы.СписокКонстант;

	СписокПредставлений = Новый Массив;
	СписокИмен          = Новый Массив;
	Для Каждого Строка Из Элемент.ВыделенныеСтроки Цикл
		Данные = Элемент.ДанныеСтроки(Строка);
		СписокПредставлений.Добавить(Данные.Наименование);
		СписокИмен.Добавить(Данные.МетаПолноеИмя);
	КонецЦикла;

	Колво = СписокИмен.Количество();
	Если Колво = 0 Тогда
		Возврат;
	ИначеЕсли Колво = 1 Тогда
		Текст = НСтр("ru='Отменить регистрацию ""%2""
					 |на узле ""%1""?'");
	Иначе
		Текст = НСтр("ru='Отменить регистрацию выбранных констант
					 |на узле ""%1""?'");
	КонецЕсли;
	Текст = СтрЗаменить(Текст, "%1", УзелОбменаСсылка);
	Текст = СтрЗаменить(Текст, "%2", СписокПредставлений[0]);

	ЗаголовокВопроса = НСтр("ru='Подтверждение'");

	Оповещение = Новый ОписаниеОповещения("УдалитьРегистрациюКонстантыВСпискеЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("СписокИмен", СписокИмен);

	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюКонстантыВСпискеЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;

	СообщитьОРезультатахРегистрации(Ложь, УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка,
		ДополнительныеПараметры.СписокИмен));

	Элементы.СписокКонстант.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВСписокСсылок(ЭтоПодбор = Ложь)
	ТекИмяФормы = ПолучитьИмяФормы(ОсновнаяТаблицаСпискаСсылок) + "ФормаВыбора";
	ТекПараметры = Новый Структура("РежимВыбора, МножественныйВыбор, ЗакрыватьПриВыборе, ВыборГруппИЭлементов", Истина,
		Истина, ЭтоПодбор, ИспользованиеГруппИЭлементов.ГруппыИЭлементы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокСсылок);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюУдаленияОбъектаВСписокСсылок()
	Ссылка = СсылкаДляУдаленияОбъекта();
	ОбработкаВыбораДанных(Элементы.СписокСсылок, Ссылка);
КонецПроцедуры

&НаСервере
Функция СсылкаДляУдаленияОбъекта(Знач УникальныйИдентификатор = Неопределено)
	Описание = ЭтотОбъектОбработки().ХарактеристикиПоМетаданным(СписокСсылок.ОсновнаяТаблица);
	Если УникальныйИдентификатор = Неопределено Тогда
		Возврат Описание.Менеджер.ПолучитьСсылку();
	КонецЕсли;
	Возврат Описание.Менеджер.ПолучитьСсылку(УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Процедура ДобавитьРегистрациюВСписокОтбор()
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Истина, ОсновнаяТаблицаСпискаСсылок);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокСсылок);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВСпискеОтбор()
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Ложь, ОсновнаяТаблицаСпискаСсылок);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокСсылок);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюИзСпискаСсылок()

	Элемент = Элементы.СписокСсылок;

	СписокУдаления = Новый Массив;
	Для Каждого Строка Из Элемент.ВыделенныеСтроки Цикл
		Данные = Элемент.ДанныеСтроки(Строка);
		СписокУдаления.Добавить(Данные.Ссылка);
	КонецЦикла;

	Колво = СписокУдаления.Количество();
	Если Колво = 0 Тогда
		Возврат;
	ИначеЕсли Колво = 1 Тогда
		Текст = НСтр("ru='Отменить регистрацию ""%2""
					 |на узле ""%1""?'");
	Иначе
		Текст = НСтр("ru='Отменить регистрацию выбранных объектов
					 |на узле ""%1""?'");
	КонецЕсли;
	Текст = СтрЗаменить(Текст, "%1", УзелОбменаСсылка);
	Текст = СтрЗаменить(Текст, "%2", СписокУдаления[0]);

	ЗаголовокВопроса = НСтр("ru='Подтверждение'");

	Оповещение = Новый ОписаниеОповещения("УдалитьРегистрациюИзСпискаСсылокЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("СписокУдаления", СписокУдаления);

	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюИзСпискаСсылокЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;

	СообщитьОРезультатахРегистрации(Ложь, УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка,
		ДополнительныеПараметры.СписокУдаления));

	Элементы.СписокСсылок.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВНаборЗаписейОтбор()
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Истина, СписокНаборовЗаписейИмяТаблицы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокНаборовЗаписей);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВНабореЗаписей()

	СтруктураДанных = "";
	ИменаКлючей = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
	Для Каждого Имя Из ИменаКлючей Цикл
		СтруктураДанных = СтруктураДанных + "," + Имя;
	КонецЦикла;
	СтруктураДанных = Сред(СтруктураДанных, 2);

	Данные = Новый Массив;
	Элемент = Элементы.СписокНаборовЗаписей;
	Для Каждого Строка Из Элемент.ВыделенныеСтроки Цикл
		ТекДанные = Элемент.ДанныеСтроки(Строка);
		ДанныеСтроки = Новый Структура;
		Для Каждого Имя Из ИменаКлючей Цикл
			ДанныеСтроки.Вставить(Имя, ТекДанные["СписокНаборовЗаписей" + Имя]);
		КонецЦикла;
		Данные.Добавить(ДанныеСтроки);
	КонецЦикла;

	Если Данные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Выбор = Новый Структура("ИмяТаблицы, ДанныеВыбора, ДействиеВыбора, СтруктураПолей", СписокНаборовЗаписейИмяТаблицы,
		Данные, Ложь, СтруктураДанных);

	ОбработкаВыбораДанных(Элементы.СписокНаборовЗаписей, Выбор);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВНабореЗаписейОтбор()
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", Ложь, СписокНаборовЗаписейИмяТаблицы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокНаборовЗаписей);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВыделенныхОбъектов(БезУчетаАвторегистрации = Истина)

	Данные = ПолучитьВыбранныеИменаМетаданных(БезУчетаАвторегистрации);
	Колво = Данные.МетаИмена.Количество();
	Если Колво = 0 Тогда
		// Текущая строка
		Данные = ПолучитьИменаМетаданныхТекущейСтроки(БезУчетаАвторегистрации);
	КонецЕсли;

	Текст = НСтр("ru='Зарегистрировать %1 для выгрузки на узле ""%2""?
				 |
				 |Изменение регистрации большого количества объектов может занять продолжительное время!'");

	Текст = СтрЗаменить(Текст, "%1", Данные.Описание);
	Текст = СтрЗаменить(Текст, "%2", УзелОбменаСсылка);

	ЗаголовокВопроса = НСтр("ru='Подтверждение'");

	Оповещение = Новый ОписаниеОповещения("ДобавитьРегистрациюВыделенныхОбъектовЗавершение", ЭтотОбъект,
		Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("МетаИмена", Данные.МетаИмена);
	Оповещение.ДополнительныеПараметры.Вставить("БезУчетаАвторегистрации", БезУчетаАвторегистрации);

	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВыделенныхОбъектовЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;

	Результат = ДобавитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, УзелОбменаСсылка,
		ДополнительныеПараметры.МетаИмена);

	ЗаполнитьКоличествоРегистрацийВДереве();
	ОбновитьСодержимоеСтраницы();
	СообщитьОРезультатахРегистрации(Истина, Результат);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВыделенныхОбъектов(БезУчетаАвторегистрации = Истина)

	Данные = ПолучитьВыбранныеИменаМетаданных(БезУчетаАвторегистрации);
	Колво = Данные.МетаИмена.Количество();
	Если Колво = 0 Тогда
		Данные = ПолучитьИменаМетаданныхТекущейСтроки(БезУчетаАвторегистрации);
	КонецЕсли;

	Текст = НСтр("ru='Отменить регистрацию %1 для выгрузки на узле ""%2""?
				 |
				 |Изменение регистрации большого количества объектов может занять продолжительное время!'");

	ЗаголовокВопроса = НСтр("ru='Подтверждение'");

	Текст = СтрЗаменить(Текст, "%1", Данные.Описание);
	Текст = СтрЗаменить(Текст, "%2", УзелОбменаСсылка);

	Оповещение = Новый ОписаниеОповещения("УдалитьРегистрациюВыделенныхОбъектовЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("МетаИмена", Данные.МетаИмена);
	Оповещение.ДополнительныеПараметры.Вставить("БезУчетаАвторегистрации", БезУчетаАвторегистрации);

	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВыделенныхОбъектовЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;

	СообщитьОРезультатахРегистрации(Ложь, УдалитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации,
		УзелОбменаСсылка, ДополнительныеПараметры.МетаИмена));

	ЗаполнитьКоличествоРегистрацийВДереве();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбораДанных(ТаблицаФормы, ВыбранноеЗначение)

	Ссылка = Неопределено;
	Тип    = ТипЗнч(ВыбранноеЗначение);

	Если Тип = Тип("Структура") Тогда
		ИмяТаблицы = ВыбранноеЗначение.ИмяТаблицы;
		Действие   = ВыбранноеЗначение.ДействиеВыбора;
		Данные     = ВыбранноеЗначение.ДанныеВыбора;
	Иначе
		ИмяТаблицы = Неопределено;
		Действие = Истина;
		Если Тип = Тип("Массив") Тогда
			Данные = ВыбранноеЗначение;
		Иначе
			Данные = Новый Массив;
			Данные.Добавить(ВыбранноеЗначение);
		КонецЕсли;

		Если Данные.Количество() = 1 Тогда
			Ссылка = Данные[0];
		КонецЕсли;
	КонецЕсли;

	Если Действие Тогда
		Результат = ДобавитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, Данные, ИмяТаблицы);

		ТаблицаФормы.Обновить();
		ЗаполнитьКоличествоРегистрацийВДереве();
		СообщитьОРезультатахРегистрации(Действие, Результат);

		ТаблицаФормы.ТекущаяСтрока = Ссылка;
		Возврат;
	КонецЕсли;

	Если Ссылка = Неопределено Тогда
		Текст = НСтр("ru='Отменить регистрацию выбранных объектов
					 |на узле ""%1?'");
	Иначе
		Текст = НСтр("ru='Отменить регистрацию ""%2""
					 |на узле ""%1?'");
	КонецЕсли;

	Текст = СтрЗаменить(Текст, "%1", УзелОбменаСсылка);
	Текст = СтрЗаменить(Текст, "%2", Ссылка);

	ЗаголовокВопроса = НСтр("ru='Подтверждение'");

	Оповещение = Новый ОписаниеОповещения("ОбработкаВыбораДанныхЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("Действие", Действие);
	Оповещение.ДополнительныеПараметры.Вставить("ТаблицаФормы", ТаблицаФормы);
	Оповещение.ДополнительныеПараметры.Вставить("Данные", Данные);
	Оповещение.ДополнительныеПараметры.Вставить("ИмяТаблицы", ИмяТаблицы);
	Оповещение.ДополнительныеПараметры.Вставить("Ссылка", Ссылка);

	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбораДанныхЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;

	Результат = УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, ДополнительныеПараметры.Данные,
		ДополнительныеПараметры.ИмяТаблицы);

	ДополнительныеПараметры.ТаблицаФормы.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
	СообщитьОРезультатахРегистрации(ДополнительныеПараметры.Действие, Результат);

	ДополнительныеПараметры.ТаблицаФормы.ТекущаяСтрока = ДополнительныеПараметры.Ссылка;
КонецПроцедуры

&НаСервере
Процедура ОбновитьСодержимоеСтраницы(Страница = Неопределено)
	ТекСтр = ?(Страница = Неопределено, Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница, Страница);

	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		Элементы.СписокСсылок.Обновить();

	ИначеЕсли ТекСтр = Элементы.СтраницаКонстанты Тогда
		Элементы.СписокКонстант.Обновить();

	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		Элементы.СписокНаборовЗаписей.Обновить();

	ИначеЕсли ТекСтр = Элементы.СтраницаПустая Тогда
		Строка = Элементы.ДеревоМетаданных.ТекущаяСтрока;
		Если Строка <> Неопределено Тогда
			Данные = ДеревоМетаданных.НайтиПоИдентификатору(Строка);
			Если Данные <> Неопределено Тогда
				НастроитьПустуюСтраницу(Данные.Наименование, Данные.МетаПолноеИмя);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПолучитьТекущийОбъектРедактирования()

	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;

	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		Данные = Элементы.СписокСсылок.ТекущиеДанные;
		Если Данные <> Неопределено Тогда
			Возврат Данные.Ссылка;
		КонецЕсли;

	ИначеЕсли ТекСтр = Элементы.СтраницаКонстанты Тогда
		Данные = Элементы.СписокКонстант.ТекущиеДанные;
		Если Данные <> Неопределено Тогда
			Возврат Данные.МетаПолноеИмя;
		КонецЕсли;

	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		Данные = Элементы.СписокНаборовЗаписей.ТекущиеДанные;
		Если Данные <> Неопределено Тогда
			Результат = Новый Структура;
			Измерения = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
			Для Каждого Имя Из Измерения Цикл
				Результат.Вставить(Имя, Данные["СписокНаборовЗаписей" + Имя]);
			КонецЦикла;
		КонецЕсли;
		Возврат Результат;

	КонецЕсли;

	Возврат Неопределено;

КонецФункции

&НаКлиенте
Процедура ОткрытьФормуНастроекОбработки()
	ТекИмяФормы = ПолучитьИмяФормы() + "Форма.Настройки";
	ОткрытьФорму(ТекИмяФормы, , ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОперацияСРезультатамиЗапроса(КомандаОперации)

	ТекИмяФормы = ПолучитьФормуВыбораРезультатаЗапроса();
	Если ТекИмяФормы <> Неопределено Тогда
		// Открываем
		Если КомандаОперации Тогда
			Текст = НСтр("ru='Регистрация изменений результата запроса'");
		Иначе
			Текст = НСтр("ru='Отмена регистрации изменений результата запроса'");
		КонецЕсли;
		ОткрытьФорму(ТекИмяФормы, Новый Структура("Заголовок, ДействиеВыбора, РежимВыбора, ЗакрыватьПриВыборе, ",
			Текст, КомандаОперации, Истина, Ложь), ЭтотОбъект);
		Возврат;
	КонецЕсли;
	
	// Не настроено или что-то поломано, предлагаем выбрать
	ТекстВопроса = НСтр("ru='В настройках не указана обработка для выполнения запросов.
						|Настроить сейчас?'");

	ЗаголовокВопроса = НСтр("ru='Настройки'");

	Оповещение = Новый ОписаниеОповещения("ОперацияСРезультатамиЗапросаЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

&НаКлиенте
Процедура ОперацияСРезультатамиЗапросаЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;

	ОткрытьФормуНастроекОбработки();
КонецПроцедуры

&НаСервере
Функция ЗакавычитьСтроку(Строка)
	Возврат СтрЗаменить(Строка, """", """""");
КонецФункции

&НаСервере
Функция ЭтотОбъектОбработки(ТекущийОбъект = Неопределено)
	Если ТекущийОбъект = Неопределено Тогда
		Возврат РеквизитФормыВЗначение("Объект");
	КонецЕсли;
	ЗначениеВРеквизитФормы(ТекущийОбъект, "Объект");
	Возврат Неопределено;
КонецФункции

&НаСервере
Функция ПолучитьИмяФормы(ТекущийОбъект = Неопределено)
	Возврат ЭтотОбъектОбработки().ПолучитьИмяФормы(ТекущийОбъект);
КонецФункции

&НаСервере
Процедура ИзменениеПометки(Строка)
	ЭлементДанных = ДеревоМетаданных.НайтиПоИдентификатору(Строка);
	ЭтотОбъектОбработки().ИзменениеПометки(ЭлементДанных);
КонецПроцедуры

&НаСервере
Процедура ПрочитатьДеревоМетаданных()
	Данные = ЭтотОбъектОбработки().СформироватьСтруктуруМетаданных(УзелОбменаСсылка);
	
	// Удаляем строки, которые нельзя редактировать
	МетаДерево = Данные.Дерево;
	Для Каждого ЭлементСписка Из ИменаСкрываемыхМетаданных Цикл
		УдалитьСтрокиДереваЗначенийМетаданных(ЭлементСписка.Значение, МетаДерево.Строки);
	КонецЦикла;

	ЗначениеВРеквизитФормы(МетаДерево, "ДеревоМетаданных");
	СтруктураАвторегистрацииМетаданных = Данные.СтруктураАвторегистрации;
	СтруктураПредставленийМетаданных   = Данные.СтруктураПредставлений;
	СтруктураИменМетаданных            = Данные.СтруктураИмен;
КонецПроцедуры

&НаСервере
Процедура УдалитьСтрокиДереваЗначенийМетаданных(Знач МетаПолноеИмя, СтрокиДерева)
	Если ПустаяСтрока(МетаПолноеИмя) Тогда
		Возврат;
	КонецЕсли;
	
	// В текущем наборе
	Фильтр = Новый Структура("МетаПолноеИмя", МетаПолноеИмя);
	Для Каждого СтрокаУдаления Из СтрокиДерева.НайтиСтроки(Фильтр, Ложь) Цикл
		СтрокиДерева.Удалить(СтрокаУдаления);
	КонецЦикла;
	
	// И из оставшихся иерархически
	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		УдалитьСтрокиДереваЗначенийМетаданных(МетаПолноеИмя, СтрокаДерева.Строки);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ФорматироватьКоличествоИзменений(Строка)
	Строка.КоличествоИзмененийСтрокой = Формат(Строка.КоличествоИзменений, "ЧН=") + " / " + Формат(
		Строка.КоличествоНеВыгруженных, "ЧН=");
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьКоличествоРегистрацийВДереве()

	Данные = ЭтотОбъектОбработки().ПолучитьКоличествоИзменений(СтруктураИменМетаданных, УзелОбменаСсылка);
	
	// Проставляем в дерево
	Фильтр = Новый Структура("МетаПолноеИмя, УзелОбмена", Неопределено, УзелОбменаСсылка);
	Нули   = Новый Структура("КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных", 0, 0, 0);

	Для Каждого Корень Из ДеревоМетаданных.ПолучитьЭлементы() Цикл
		СуммаКорень = Новый Структура("КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных", 0, 0, 0);

		Для Каждого Группа Из Корень.ПолучитьЭлементы() Цикл
			СуммаГруппа = Новый Структура("КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных", 0, 0,
				0);

			СписокУзлов = Группа.ПолучитьЭлементы();
			Если СписокУзлов.Количество() = 0 И СтруктураИменМетаданных.Свойство(Группа.МетаПолноеИмя) Тогда
				// Коллекция узлов без узлов, просуммируем руками, авторегистрацию возьмем из структуры
				Для Каждого МетаИмя Из СтруктураИменМетаданных[Группа.МетаПолноеИмя] Цикл
					Фильтр.МетаПолноеИмя = МетаИмя;
					Найдено = Данные.НайтиСтроки(Фильтр);
					Если Найдено.Количество() > 0 Тогда
						Строка = Найдено[0];
						СуммаГруппа.КоличествоИзменений     = СуммаГруппа.КоличествоИзменений
							+ Строка.КоличествоИзменений;
						СуммаГруппа.КоличествоВыгруженных   = СуммаГруппа.КоличествоВыгруженных
							+ Строка.КоличествоВыгруженных;
						СуммаГруппа.КоличествоНеВыгруженных = СуммаГруппа.КоличествоНеВыгруженных
							+ Строка.КоличествоНеВыгруженных;
					КонецЕсли;
				КонецЦикла;

			Иначе
				// Считаем по каждому узлу
				Для Каждого Узел Из СписокУзлов Цикл
					Фильтр.МетаПолноеИмя = Узел.МетаПолноеИмя;
					Найдено = Данные.НайтиСтроки(Фильтр);
					Если Найдено.Количество() > 0 Тогда
						Строка = Найдено[0];
						ЗаполнитьЗначенияСвойств(Узел, Строка,
							"КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных");
						СуммаГруппа.КоличествоИзменений     = СуммаГруппа.КоличествоИзменений
							+ Строка.КоличествоИзменений;
						СуммаГруппа.КоличествоВыгруженных   = СуммаГруппа.КоличествоВыгруженных
							+ Строка.КоличествоВыгруженных;
						СуммаГруппа.КоличествоНеВыгруженных = СуммаГруппа.КоличествоНеВыгруженных
							+ Строка.КоличествоНеВыгруженных;
					Иначе
						ЗаполнитьЗначенияСвойств(Узел, Нули);
					КонецЕсли;

					ФорматироватьКоличествоИзменений(Узел);
				КонецЦикла;

			КонецЕсли;
			ЗаполнитьЗначенияСвойств(Группа, СуммаГруппа);

			СуммаКорень.КоличествоИзменений     = СуммаКорень.КоличествоИзменений + Группа.КоличествоИзменений;
			СуммаКорень.КоличествоВыгруженных   = СуммаКорень.КоличествоВыгруженных + Группа.КоличествоВыгруженных;
			СуммаКорень.КоличествоНеВыгруженных = СуммаКорень.КоличествоНеВыгруженных + Группа.КоличествоНеВыгруженных;

			ФорматироватьКоличествоИзменений(Группа);
		КонецЦикла;

		ЗаполнитьЗначенияСвойств(Корень, СуммаКорень);

		ФорматироватьКоличествоИзменений(Корень);
	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ИзменитьРегистрациюРезультатаЗапросаСервер(Команда, Адрес)

	Результат = ПолучитьИзВременногоХранилища(Адрес);
	Результат= Результат[Результат.ВГраница()];
	Данные = Результат.Выгрузить().ВыгрузитьКолонку("Ссылка");

	Если Команда Тогда
		Возврат ДобавитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, Данные);
	КонецЕсли;

	Возврат УдалитьРегистрациюНаСервере(Истина, УзелОбменаСсылка, Данные);
КонецФункции

&НаСервере
Функция КонтрольСсылокДляВыбораЗапросом(Адрес)

	Результат = ?(Адрес = Неопределено, Неопределено, ПолучитьИзВременногоХранилища(Адрес));
	Если ТипЗнч(Результат) = Тип("Массив") Тогда
		Результат = Результат[Результат.ВГраница()];
		Если Результат.Колонки.Найти("Ссылка") = Неопределено Тогда
			Возврат НСтр("ru='В последнем результате запроса отсутствует колонка ""Ссылка""'");
		КонецЕсли;
	Иначе
		Возврат НСтр("ru='Ошибка получения данных результата запроса'");
	КонецЕсли;

	Возврат "";
КонецФункции

&НаСервере
Процедура НастроитьРедактированиеИзмененийСервер(ТекущаяСтрока)

	Данные = ДеревоМетаданных.НайтиПоИдентификатору(ТекущаяСтрока);
	Если Данные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ИмяТаблицы   = Данные.МетаПолноеИмя;
	Наименование = Данные.Наименование;
	ТекущийОбъект   = ЭтотОбъектОбработки();

	Если ПустаяСтрока(ИмяТаблицы) Тогда
		Мета = Неопределено;
	Иначе
		Мета = ТекущийОбъект.МетаданныеПоПолномуИмени(ИмяТаблицы);
	КонецЕсли;

	Если Мета = Неопределено Тогда
		НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
		НовСтраница = Элементы.СтраницаПустая;

	ИначеЕсли Мета = Метаданные.Константы Тогда
		// Все константы системы
		НастроитьСписокКонстант();
		НовСтраница = Элементы.СтраницаКонстанты;

	ИначеЕсли ТипЗнч(Мета) = Тип("КоллекцияОбъектовМетаданных") Тогда
		// Все справочники, документы, и т.п.
		НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
		НовСтраница = Элементы.СтраницаПустая;

	ИначеЕсли Метаданные.Константы.Содержит(Мета) Тогда
		// Одиночная константа
		НастроитьСписокКонстант(ИмяТаблицы, Наименование);
		НовСтраница = Элементы.СтраницаКонстанты;

	ИначеЕсли Метаданные.Справочники.Содержит(Мета) Или Метаданные.Документы.Содержит(Мета)
		Или Метаданные.ПланыВидовХарактеристик.Содержит(Мета) Или Метаданные.ПланыСчетов.Содержит(Мета)
		Или Метаданные.ПланыВидовРасчета.Содержит(Мета) Или Метаданные.БизнесПроцессы.Содержит(Мета)
		Или Метаданные.Задачи.Содержит(Мета) Тогда
		// Ссылочный тип
		НастроитьСписокСсылок(ИмяТаблицы, Наименование);
		НовСтраница = Элементы.СтраницаСписокСсылок;

	Иначе
		// Проверим на набор записей
		Измерения = ТекущийОбъект.ИзмеренияНабораЗаписей(ИмяТаблицы);
		Если Измерения <> Неопределено Тогда
			НастроитьНаборЗаписей(ИмяТаблицы, Измерения, Наименование);
			НовСтраница = Элементы.СтраницаНаборЗаписей;
		Иначе
			НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
			НовСтраница = Элементы.СтраницаПустая;
		КонецЕсли;

	КонецЕсли;

	Элементы.СтраницаКонстанты.Видимость    = Ложь;
	Элементы.СтраницаСписокСсылок.Видимость = Ложь;
	Элементы.СтраницаНаборЗаписей.Видимость = Ложь;
	Элементы.СтраницаПустая.Видимость       = Ложь;

	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = НовСтраница;
	НовСтраница.Видимость = Истина;

	НастроитьВидимостьКомандОбщегоМеню();
КонецПроцедуры

// Вывод изменений для ссылочного типа (cправочник, документ, план видов характеристик, 
// план счетов, вид расчета, бизнес-процессы, задачи)
//
&НаСервере
Процедура НастроитьСписокСсылок(ИмяТаблицы, Наименование)

	СписокСсылок.ТекстЗапроса = 
	"ВЫБРАТЬ
	|	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
	|	ТаблицаИзменений.Ссылка КАК Ссылка,
	|	ВЫБОР
	|		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК НеВыгружалось
	|ИЗ
	|	" + ИмяТаблицы + ".Изменения КАК ТаблицаИзменений
	|ГДЕ
	|	ТаблицаИзменений.Узел = &ВыбранныйУзел";	
	
	СписокСсылок.Параметры.УстановитьЗначениеПараметра("ВыбранныйУзел", УзелОбменаСсылка);
//	СписокСсылок.ОсновнаяТаблица = ИмяТаблицы;
	СписокСсылок.ДинамическоеСчитываниеДанных = Истина;
	
	// Представление объекта
	Мета = ЭтотОбъектОбработки().МетаданныеПоПолномуИмени(ИмяТаблицы);
	ТекЗаголовок = Мета.ПредставлениеОбъекта;
	Если ПустаяСтрока(ТекЗаголовок) Тогда
		ТекЗаголовок = Наименование;
	КонецЕсли;
	Элементы.СписокСсылокСсылкаПредставление.Заголовок = ТекЗаголовок;
	
	ОсновнаяТаблицаСпискаСсылок = ИмяТаблицы;
	
КонецПроцедуры

// Вывод изменений для констант
//
&НаСервере
Процедура НастроитьСписокКонстант(ИмяТаблицы = Неопределено, Наименование = "")

	Если ИмяТаблицы = Неопределено Тогда
		// Все константы
		Имена = СтруктураИменМетаданных.Константы;
		Представления = СтруктураПредставленийМетаданных.Константы;
		Авторегистрация = СтруктураАвторегистрацииМетаданных.Константы;
	Иначе
		Имена = Новый Массив;
		Имена.Добавить(ИмяТаблицы);
		Представления = Новый Массив;
		Представления.Добавить(Наименование);
		Индекс = СтруктураИменМетаданных.Константы.Найти(ИмяТаблицы);
		Авторегистрация = Новый Массив;
		Авторегистрация.Добавить(СтруктураАвторегистрацииМетаданных.Константы[Индекс]);
	КонецЕсли;
	
	// И помнить про ограничение на количество таблиц
	Текст = "";
	Для Индекс = 0 По Имена.ВГраница() Цикл
		Имя = Имена[Индекс];
		Текст = Текст + ?(Текст = "", "ВЫБРАТЬ", "ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ") + "
																			 |	" + Формат(Авторегистрация[Индекс],
			"ЧН=; ЧГ=") + " КАК ИндексКартинкиАвторегистрация,
						  |	2                                                   КАК ИндексКартинки,
						  |
						  |	""" + ЗакавычитьСтроку(Представления[Индекс]) + """ КАК Наименование,
																			   |	""" + Имя
			+ """ КАК МетаПолноеИмя,
			  |
			  |	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
			  |	ВЫБОР 
			  |		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ
			  |	КОНЕЦ КАК НеВыгружалось
			  |ИЗ
			  |	" + Имя + ".Изменения КАК ТаблицаИзменений
							 |ГДЕ
							 |	ТаблицаИзменений.Узел=&ВыбранныйУзел
							 |";
	КонецЦикла;

	СписокКонстант.ТекстЗапроса = "
								  |ВЫБРАТЬ
								  |	ИндексКартинкиАвторегистрация, ИндексКартинки, МетаПолноеИмя, НеВыгружалось,
								  |	Наименование, НомерСообщения
								  |
								  |{ВЫБРАТЬ
								  |	ИндексКартинкиАвторегистрация, ИндексКартинки, 
								  |	Наименование, МетаПолноеИмя, 
								  |	НомерСообщения, НеВыгружалось
								  |}
								  |
								  |ИЗ (" + Текст + ") Данные
												   |
												   |{ГДЕ
												   |	Наименование, НомерСообщения, НеВыгружалось
												   |}
												   |";

	ЭлементыСписка = СписокКонстант.Порядок.Элементы;
	Если ЭлементыСписка.Количество() = 0 Тогда
		Элемент = ЭлементыСписка.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
		Элемент.Поле = Новый ПолеКомпоновкиДанных("Наименование");
		Элемент.Использование = Истина;
	КонецЕсли;

	СписокКонстант.Параметры.УстановитьЗначениеПараметра("ВыбранныйУзел", УзелОбменаСсылка);
	СписокКонстант.ДинамическоеСчитываниеДанных = Истина;
КонецПроцедуры	

// Вывод заглушки с пустой страницей.
&НаСервере
Процедура НастроитьПустуюСтраницу(Наименование, ИмяТаблицы = Неопределено)

	Если ИмяТаблицы = Неопределено Тогда
		ТекстКоличеств = "";
	Иначе
		Дерево = РеквизитФормыВЗначение("ДеревоМетаданных");
		Строка = Дерево.Строки.Найти(ИмяТаблицы, "МетаПолноеИмя", Истина);
		Если Строка <> Неопределено Тогда
			ТекстКоличеств = НСтр("ru='Зарегистрировано объектов: %1
								  |Выгружено объектов: %2
								  |Не выгружено объектов: %3
								  |'");

			ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%1", Формат(Строка.КоличествоИзменений, "ЧДЦ=0; ЧН="));
			ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%2", Формат(Строка.КоличествоВыгруженных, "ЧДЦ=0; ЧН="));
			ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%3", Формат(Строка.КоличествоНевыгруженных, "ЧДЦ=0; ЧН="));
		КонецЕсли;
	КонецЕсли;

	Текст = НСтр("ru='%1.
				 |
				 |%2
				 |Для регистрации или отмены регистрации обмена данными на узле
				 |""%3""
				 |выберите тип объекта слева в дереве метаданных и воспользуйтесь
				 |командами ""Зарегистрировать"" или ""Отменить регистрацию""'");

	Текст = СтрЗаменить(Текст, "%1", Наименование);
	Текст = СтрЗаменить(Текст, "%2", ТекстКоличеств);
	Текст = СтрЗаменить(Текст, "%3", УзелОбменаСсылка);
	Элементы.ДекорацияПустаяСтраница.Заголовок = Текст;
КонецПроцедуры

// Вывод изменений для наборов записей
//
&НаСервере
Процедура НастроитьНаборЗаписей(ИмяТаблицы, Измерения, Наименование)

	ТекстВыбора = "";
	Префикс     = "СписокНаборовЗаписей";
	Для Каждого Строка Из Измерения Цикл
		Имя = Строка.Имя;
		ТекстВыбора = ТекстВыбора + ",ТаблицаИзменений." + Имя + " КАК " + Префикс + Имя + Символы.ПС;
		// Чтобы не наступить на измерение "НомерСообщения" или "НеВыгружалось"
		Строка.Имя = Префикс + Имя;
	КонецЦикла;

	СписокНаборовЗаписей.ТекстЗапроса = "
										|ВЫБРАТЬ
										|	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
										|	ВЫБОР 
										|		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ
										|	КОНЕЦ КАК НеВыгружалось
										|
										|	" + ТекстВыбора + "
															   |ИЗ
															   |	" + ИмяТаблицы + ".Изменения КАК ТаблицаИзменений
																					 |ГДЕ
																					 |	ТаблицаИзменений.Узел = &ВыбранныйУзел
																					 |";
	СписокНаборовЗаписей.Параметры.УстановитьЗначениеПараметра("ВыбранныйУзел", УзелОбменаСсылка);
	
	// Добавляем в группу измерений
	ЭтотОбъектОбработки().ДобавитьКолонкиВТаблицуФормы(
		Элементы.СписокНаборовЗаписей, "НомерСообщения, НеВыгружалось, 
									   |Порядок, Отбор, Группировка, СтандартнаяКартинка, Параметры, УсловноеОформление",
		Измерения, Элементы.СписокНаборовЗаписейГруппаИзмерений);
	СписокНаборовЗаписей.ДинамическоеСчитываниеДанных = Истина;
	СписокНаборовЗаписейИмяТаблицы = ИмяТаблицы;
КонецПроцедуры

// Общий отбор по полю "НомерСообщения"
//
&НаСервере
Процедура УстановитьОтборПоНомеруСообщения(ДинамоСписок, Вариант)

	Поле = Новый ПолеКомпоновкиДанных("НеВыгружалось");
	// Ищем свое поле, попутно отключаем все по нему
	ЭлементыСписка = ДинамоСписок.Отбор.Элементы;
	Индекс = ЭлементыСписка.Количество();
	Пока Индекс > 0 Цикл
		Индекс = Индекс - 1;
		Элемент = ЭлементыСписка[Индекс];
		Если Элемент.ЛевоеЗначение = Поле Тогда
			ЭлементыСписка.Удалить(Элемент);
		КонецЕсли;
	КонецЦикла;

	ЭлементОтбора = ЭлементыСписка.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Поле;
	ЭлементОтбора.ВидСравнения  = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.Использование = Ложь;
	ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

	Если Вариант = 1 Тогда 		// Выгруженные
		ЭлементОтбора.ПравоеЗначение = Ложь;
		ЭлементОтбора.Использование  = Истина;

	ИначеЕсли Вариант = 2 Тогда	// Не выгруженные
		ЭлементОтбора.ПравоеЗначение = Истина;
		ЭлементОтбора.Использование  = Истина;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура НастроитьВидимостьКомандОбщегоМеню()

	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;

	Если ТекСтр = Элементы.СтраницаКонстанты Тогда
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Истина;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Ложь;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Истина;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Ложь;

	ИначеЕсли ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Истина;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Истина;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Истина;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Истина;

	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Истина;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Ложь;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Истина;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Ложь;

	Иначе
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Ложь;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Ложь;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Ложь;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Ложь;

	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция МассивИменКлючейНабораЗаписей(ИмяТаблицы, ПрефиксИмен = "")
	Результат = Новый Массив;
	Измерения = ЭтотОбъектОбработки().ИзмеренияНабораЗаписей(ИмяТаблицы);
	Если Измерения <> Неопределено Тогда
		Для Каждого Строка Из Измерения Цикл
			Результат.Добавить(ПрефиксИмен + Строка.Имя);
		КонецЦикла;
	КонецЕсли;
	Возврат Результат;
КонецФункции

&НаСервере
Функция МенеджерПоМетаданным(ИмяТаблицы)
	Описание = ЭтотОбъектОбработки().ХарактеристикиПоМетаданным(ИмяТаблицы);
	Если Описание <> Неопределено Тогда
		Возврат Описание.Менеджер;
	КонецЕсли;
	Возврат Неопределено;
КонецФункции

&НаСервере
Функция ТекстСериализации(Сериализация)

	Текст = Новый ТекстовыйДокумент;

	Запись = Новый ЗаписьXML;
	Для Каждого Элемент Из Сериализация Цикл
		Запись.УстановитьСтроку("UTF-16");
		Значение = Неопределено;

		Если Элемент.ФлагТипа = 1 Тогда
			// Метаданные
			Менеджер = МенеджерПоМетаданным(Элемент.Данные);
			Значение = Менеджер.СоздатьМенеджерЗначения();

		ИначеЕсли Элемент.ФлагТипа = 2 Тогда
			// Набор данных с отбором
			Менеджер = МенеджерПоМетаданным(СписокНаборовЗаписейИмяТаблицы);
			Значение = Менеджер.СоздатьНаборЗаписей();
			Отбор = Значение.Отбор;
			Для Каждого ИмяЗначение Из Элемент.Данные Цикл
				Отбор[ИмяЗначение.Ключ].Установить(ИмяЗначение.Значение);
			КонецЦикла;
			Значение.Прочитать();

		ИначеЕсли Элемент.ФлагТипа = 3 Тогда
			// Ссылка
			Значение = Элемент.Данные.ПолучитьОбъект();
			Если Значение = Неопределено Тогда
				Значение = Новый УдалениеОбъекта(Элемент.Данные);
			КонецЕсли;
		КонецЕсли;

		ЗаписатьXML(Запись, Значение);
		Текст.ДобавитьСтроку(Запись.Закрыть());
	КонецЦикла;

	Возврат Текст;
КонецФункции

&НаСервере
Функция УдалитьРегистрациюНаСервере(БезУчетаАвторегистрации, Узел, Удаляемые, ИмяТаблицы = Неопределено)
	Возврат ЭтотОбъектОбработки().ИзменитьРегистрациюНаСервере(Ложь, БезУчетаАвторегистрации, Узел, Удаляемые, ИмяТаблицы);
КонецФункции

&НаСервере
Функция ДобавитьРегистрациюНаСервере(БезУчетаАвторегистрации, Узел, Добавляемые, ИмяТаблицы = Неопределено)
	Возврат ЭтотОбъектОбработки().ИзменитьРегистрациюНаСервере(Истина, БезУчетаАвторегистрации, Узел, Добавляемые, ИмяТаблицы);
КонецФункции

&НаСервере
Функция ИзменитьНомерСообщенияНаСервере(Узел, НомерСообщения, Данные, ИмяТаблицы = Неопределено)
	Возврат ЭтотОбъектОбработки().ИзменитьРегистрациюНаСервере(НомерСообщения, Истина, Узел, Данные, ИмяТаблицы);
КонецФункции

&НаСервере
Функция ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, МетаИмяГруппа = Неопределено,
	МетаИмяУзел = Неопределено)

	Если МетаИмяГруппа = Неопределено И МетаИмяУзел = Неопределено Тогда
		// Не указано ничего
		Текст = НСтр("ru='все объекты %1 по выбранной иерархии вида'");

	ИначеЕсли МетаИмяГруппа <> Неопределено И МетаИмяУзел = Неопределено Тогда
		// Указана только группа, рассматриваем ее как наименование группы
		Текст = "%2 %1";

	ИначеЕсли МетаИмяГруппа = Неопределено И МетаИмяУзел <> Неопределено Тогда
		// Указан только узел, рассматриваем как много выделенных объектов
		Текст = НСтр("ru='все объекты %1 по выбранной иерархии вида'");

	Иначе
		// Указаны и группа и узел, рассматриваем как имена метаданных
		Текст = НСтр("ru='все объекты типа ""%3"" %1'");

	КонецЕсли;

	Если БезУчетаАвторегистрации Тогда
		ТекстФлага = "";
	Иначе
		ТекстФлага = НСтр("ru='с признаком авторегистрации'");
	КонецЕсли;

	Представление = "";
	Для Каждого КлючЗначение Из СтруктураПредставленийМетаданных Цикл
		Если КлючЗначение.Ключ = МетаИмяГруппа Тогда
			Индекс = СтруктураИменМетаданных[МетаИмяГруппа].Найти(МетаИмяУзел);
			Представление = ?(Индекс = Неопределено, "", КлючЗначение.Значение[Индекс]);
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Текст = СтрЗаменить(Текст, "%1", ТекстФлага);
	Текст = СтрЗаменить(Текст, "%2", НРег(МетаИмяГруппа));
	Текст = СтрЗаменить(Текст, "%3", Представление);

	Возврат СокрЛП(Текст);
КонецФункции

&НаСервере
Функция ПолучитьИменаМетаданныхТекущейСтроки(БезУчетаАвторегистрации)

	Строка = ДеревоМетаданных.НайтиПоИдентификатору(Элементы.ДеревоМетаданных.ТекущаяСтрока);
	Если Строка = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;

	Результат = Новый Структура("МетаИмена, Описание", Новый Массив, ПолучитьОписаниеВыбранныхМетаданных(
		БезУчетаАвторегистрации));
	МетаИмя = Строка.МетаПолноеИмя;
	Если ПустаяСтрока(МетаИмя) Тогда
		Результат.МетаИмена.Добавить(Неопределено);
	Иначе
		Результат.МетаИмена.Добавить(МетаИмя);

		Родитель = Строка.ПолучитьРодителя();
		МетаРодительИмя = Родитель.МетаПолноеИмя;
		Если ПустаяСтрока(МетаРодительИмя) Тогда
			Результат.Описание = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, Строка.Наименование);
		Иначе
			Результат.Описание = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, МетаРодительИмя, МетаИмя);
		КонецЕсли;
	КонецЕсли;

	Возврат Результат;
КонецФункции

&НаСервере
Функция ПолучитьВыбранныеИменаМетаданных(БезУчетаАвторегистрации)

	Результат = Новый Структура("МетаИмена, Описание", Новый Массив, ПолучитьОписаниеВыбранныхМетаданных(
		БезУчетаАвторегистрации));

	Для Каждого Корень Из ДеревоМетаданных.ПолучитьЭлементы() Цикл

		Если Корень.Пометка = 1 Тогда
			Результат.МетаИмена.Добавить(Неопределено);
			Возврат Результат;
		КонецЕсли;

		КолвоЧастичных = 0;
		КолвоГрупп     = 0;
		КолвоУзлов     = 0;
		Для Каждого Группа Из Корень.ПолучитьЭлементы() Цикл

			Если Группа.Пометка = 0 Тогда
				Продолжить;
			ИначеЕсли Группа.Пометка = 1 Тогда
				//	Весь группа целиком, смотрим откуда выбирать значения
				КолвоГрупп = КолвоГрупп + 1;
				ОписаниеГруппы = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, Группа.Наименование);

				Если Группа.ПолучитьЭлементы().Количество() = 0 Тогда
					// Пробуем из структуры имен метаданных, считаем все отмеченными
					//@skip-warning
					МассивПредставлений = СтруктураПредставленийМетаданных[Группа.МетаПолноеИмя];
					МассивАвто          = СтруктураАвторегистрацииМетаданных[Группа.МетаПолноеИмя];
					МассивИмен          = СтруктураИменМетаданных[Группа.МетаПолноеИмя];
					Для Индекс = 0 По МассивИмен.ВГраница() Цикл
						Если БезУчетаАвторегистрации Или МассивАвто[Индекс] = 2 Тогда
							Результат.МетаИмена.Добавить(МассивИмен[Индекс]);
							ОписаниеУзла = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации,
								Группа.МетаПолноеИмя, МассивИмен[Индекс]);
						КонецЕсли;
					КонецЦикла;

					Продолжить;
				КонецЕсли;

			Иначе
				КолвоЧастичных = КолвоЧастичных + 1;
			КонецЕсли;

			Для Каждого Узел Из Группа.ПолучитьЭлементы() Цикл
				Если Узел.Пометка = 1 Тогда
					// Узел.Авторегистрация=2 -> разрешена
					Если БезУчетаАвторегистрации Или Узел.Авторегистрация = 2 Тогда
						Результат.МетаИмена.Добавить(Узел.МетаПолноеИмя);
						ОписаниеУзла = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации,
							Группа.МетаПолноеИмя, Узел.МетаПолноеИмя);
						КолвоУзлов = КолвоУзлов + 1;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла
			;

		КонецЦикла;

		Если КолвоГрупп = 1 И КолвоЧастичных = 0 Тогда
			Результат.Описание = ОписаниеГруппы;
		ИначеЕсли КолвоГрупп = 0 И КолвоУзлов = 1 Тогда
			Результат.Описание = ОписаниеУзла;
		КонецЕсли;

	КонецЦикла;

	Возврат Результат;
КонецФункции

&НаСервере
Функция ПрочитатьНомераСообщений()
	РеквизитыЗапроса = "НомерОтправленного, НомерПринятого";
	Данные = ЭтотОбъектОбработки().ПолучитьПараметрыУзлаОбмена(УзелОбменаСсылка, РеквизитыЗапроса);
	Если Данные = Неопределено Тогда
		Возврат Новый Структура(РеквизитыЗапроса)
	КонецЕсли
	;
	Возврат Данные;
КонецФункции

&НаСервере
Процедура ОбработатьЗапретИзмененияУзла()
	ОперацииРазрешены = Не ЗапрещеноВыбиратьУзелОбмена;

	Если ОперацииРазрешены Тогда
		Элементы.УзелОбменаСсылка.Видимость = Истина;
		Заголовок = НСтр("ru='Регистрация изменений для обмена данными'");
	Иначе
		Элементы.УзелОбменаСсылка.Видимость = Ложь;
		Заголовок = СтрЗаменить(НСтр("ru='Регистрация изменений для обмена с  ""%1""'"), "%1", Строка(УзелОбменаСсылка));
	КонецЕсли;

	Элементы.ФормаОткрытьФормуРегистрацииНаУзлах.Видимость = ОперацииРазрешены;

	Элементы.СписокКонстантКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах.Видимость       = ОперацииРазрешены;
	Элементы.СписокСсылокКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах.Видимость         = ОперацииРазрешены;
	Элементы.СписокНаборовЗаписейКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах.Видимость = ОперацииРазрешены;
КонецПроцедуры

&НаСервере
Функция ПроконтролироватьНастройки()
	Результат = Истина;
	
	// Проверим на допустимость узла пришедшего из параметра или настроек
	ТекущийОбъект = ЭтотОбъектОбработки();
	Если УзелОбменаСсылка <> Неопределено И ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(УзелОбменаСсылка)) Тогда
		ДопустимыеУзлыОбмена = ТекущийОбъект.СформироватьДеревоУзлов();
		//@skip-warning
		ИмяПлана = УзелОбменаСсылка.Метаданные().Имя;
		Если ДопустимыеУзлыОбмена.Строки.Найти(ИмяПлана, "ПланОбменаИмя", Истина) = Неопределено Тогда
			// Узел неверного плана обмена
			УзелОбменаСсылка = Неопределено;
			Результат = Ложь;
		ИначеЕсли УзелОбменаСсылка = ПланыОбмена[ИмяПлана].ЭтотУзел() Тогда
			// Этот узел
			УзелОбменаСсылка = Неопределено;
			Результат = Ложь;
		КонецЕсли;
	КонецЕсли;

	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ОбработкаВыбораУзлаОбмена();
	КонецЕсли;
	ОбработатьЗапретИзмененияУзла();
	
	// Зависимость настроек
	УстановитьОтборПоНомеруСообщения(СписокКонстант, ВариантОтбораПоНомеруСообщения);
	УстановитьОтборПоНомеруСообщения(СписокСсылок, ВариантОтбораПоНомеруСообщения);
	УстановитьОтборПоНомеруСообщения(СписокНаборовЗаписей, ВариантОтбораПоНомеруСообщения);

	Возврат Результат;
КонецФункции

&НаСервере
Функция СтруктураКлючаНабораЗаписей(Знач ТекущиеДанные)
	Описание  = ЭтотОбъектОбработки().ХарактеристикиПоМетаданным(СписокНаборовЗаписейИмяТаблицы);

	Если Описание = Неопределено Тогда
		// Неизвестный источник
		Возврат Неопределено;
	КонецЕсли;

	Результат = Новый Структура("Ключ, ИмяФормы");

	Измерения = Новый Структура;
	ИменаКлючей = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
	Для Каждого Имя Из ИменаКлючей Цикл
		Измерения.Вставить(Имя, ТекущиеДанные["СписокНаборовЗаписей" + Имя]);
	КонецЦикла;

	Если Измерения.Свойство("Регистратор") Тогда
		МетаРегистратора = Метаданные.НайтиПоТипу(ТипЗнч(Измерения.Регистратор));
		Если МетаРегистратора = Неопределено Тогда
			Результат = Неопределено;
		Иначе
			Результат.ИмяФормы = МетаРегистратора.ПолноеИмя() + ".ФормаОбъекта";
			Результат.Ключ     = Измерения.Регистратор;
		КонецЕсли;
	ИначеЕсли Измерения.Количество() = 0 Тогда
		// Вырожденный набор записей
		Результат.ИмяФормы = СписокНаборовЗаписейИмяТаблицы + ".ФормаСписка";
	Иначе
		Результат.ИмяФормы = СписокНаборовЗаписейИмяТаблицы + ".ФормаЗаписи";
		Результат.Ключ     = Описание.Менеджер.СоздатьКлючЗаписи(Измерения);
	КонецЕсли;

	Возврат Результат;
КонецФункции